# -*- coding:utf-8 -*-
# @Time: 2020/9/9 18:24
# @Author: 周铖鑫
# @Description：求解矩阵的特征值和特征向量
# @File: EigenvalueEigenvector.py
import numpy as np

np.set_printoptions(suppress=True)
A = np.array([[0, 1, 0, 1, 0],
              [1, 0, 1, 0, 1],
              [0, 1, 0, 1, 1],
              [1, 0, 1, 0, 0],
              [1, 1, 1, 0, 0]])

B=np.array(([3,0,0,0,0],
            [0,3,0,0,0],
            [0,0,3,0,0],
            [0,0,0,2,0],
            [0,0,0,0,3]))
# 计算特征向量中心性
def CentralityEig(array):
    print("对应的邻接矩阵A:\n{}".format(array))
    eigenvalue, eigenvector = np.linalg.eig(array)
    print("最大特征值:\n{}".format(eigenvalue.max(axis=0)))
    print("对应的特征向量:\n{}".format(eigenvector[eigenvalue.argmax()]))

#计算Katz中心性
def CenterKatz(array):
    print("对应的邻接矩阵A:\n{}".format(array))
    eigenvalue, eigenvector = np.linalg.eig(array)
    print("最大特征值:\n{}".format(eigenvalue.max(axis=0)))
    maxEigenvalue=eigenvalue.max(axis=0)
    #print("对应的特征向量:\n{}".format(eigenvector[eigenvalue.argmax()]))
    alpha=np.random.uniform(0,1/maxEigenvalue)
    beta=np.random.uniform(0.2,0.5)
    s="alpha:"+repr(round(alpha,2))+"     beta:  "+repr(round(beta,2))
    print(s)
    centerKatz=(beta*np.matrix((((np.identity(array.shape[0])-alpha*(array.T))))).I)*np.ones((array.shape[0],1))
    print("Katz中心性:\n{}".format(centerKatz))
    print("Katz中心性最高值:\n{}".format(centerKatz.max(axis=0)))
    s="结点V"+repr(eigenvalue.argmax()+1)+"具有最高的Katz中心性"
    print(s)

#PageRank值计算
def PageRank(array,arrayDegree):
    alpha=0.95
    beta=0.1
    I=np.identity(array.shape[0])
    At=array.T
    D=np.matrix(arrayDegree).I
    pageRank=np.matrix(beta*(I-alpha*At*D)).I*np.ones((array.shape[0],1))
    print(pageRank)
    s = "结点V" + repr(pageRank.argmax() + 1) + "具有最高的pageRank值"
    print(s)

CentralityEig(A)
CenterKatz(A)
PageRank(A,B)
